package com.baosight.sczx.common.zm.cInterface.cp;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.baosight.iplat4j.core.ei.EiInfo;
import com.baosight.iplat4j.core.spring.SpringApplicationContext;
import com.baosight.iplat4j.core.threadlocal.UserSession;
import com.baosight.iplat4j.dao.Dao;
import com.baosight.sczx.common.zm.basetools.TablePk;
import com.baosight.sczx.zm.cp.domain.ZMCPProducePlan;
import com.baosight.sczx.zm.cp.domain.ZMCPProfessionalPlan;

/***
 * 生产计划接口
 * @author wealupa
 * By.严洪浩
 */
public class ProducePlan {
	
	private static Dao dao = (Dao)SpringApplicationContext.getBean("dao");
	
	/**
	 * 判断是否能上报
	 * 如果为空，可以上报，则增加一条主表记录
	 * 如果不为空，可以上报，获得这条记录
	 * @param eiInfo
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static String checkCanReport(EiInfo eiInfo) {
		//某年、某月、某矿井
		//生产计划主表是否存在
		String fdPlanYear = eiInfo.getBlock("result").getCellStr(0, "fdPlanYear");
		String fdPlanMonth = eiInfo.getBlock("result").getCellStr(0, "fdPlanMonth");
		String fdMiningId = UserSession.getInSessionProperty("miningCode").toString();
		
		Map<String, String> map = new HashMap<String, String>();
		
		map.put("fdMiningId", fdMiningId);
		map.put("fdPlanYear", fdPlanYear);
		map.put("fdPlanMonth", fdPlanMonth);
		List _result = dao.query("ZMCPProducePlan.query", map);
		
		if(_result == null || _result.isEmpty()) {
			//不存在，就要新增
			ZMCPProducePlan _plan = new ZMCPProducePlan();
			
			String fdKeyId = TablePk.getInstance().getNextValue("T_CP_PRODUCEPLAN");
				
			_plan.setFdKeyId(fdKeyId);
			_plan.setFdTitle(fdPlanYear+"年"+fdPlanMonth+"月的生产计划");
			_plan.setFdMiningId(UserSession.getInSessionProperty("miningCode") == null ? "" : UserSession.getInSessionProperty("miningCode").toString());
			_plan.setFdMiningName(UserSession.getInSessionProperty("miningName") == null ? "" : UserSession.getInSessionProperty("miningName").toString());
			_plan.setFdPlanYear(fdPlanYear);
			_plan.setFdPlanMonth(fdPlanMonth);
			_plan.setFdPlanStatus("草拟");
			_plan.setFdPlanSource(new Long(2));//混合

			dao.insert("ZMCPProducePlan.insert", _plan.toMap());
			return fdKeyId;
		}
		else {
			//如果存在，已经生效 或者 都开始调整，则不能上报
			ZMCPProducePlan _plan = new ZMCPProducePlan();

			for (int i = 0; i < _result.size(); i++) {
				_plan = (ZMCPProducePlan)_result.get(i);
				if (_plan.getFdPlanStatus() != null && _plan.getFdPlanStatus().trim().equals("草拟")) {
					return _plan.getFdKeyId();
				}
			}
			
		}
		return null;

	}

	/**
	 * 根据采煤计划明细的变动
	 * 更新专业计划主表的数据
	 * 参数为专业计划keyID
	 * type 0 生产计划从表新增、删除、修改，type 1 专业计划上报，type 2 退回、撤回
	 */
	@SuppressWarnings("rawtypes")
	public static boolean updateByCM(String fdKeyId, List<String> fdProfessionalPlanIds, int type) {

		if(fdKeyId == null || fdKeyId.trim().equals("")) {
			return false;
		}
		
		Map<String, String> _map = new HashMap<String, String>();
		_map.put("fdKeyId", fdKeyId);
		
		List result = dao.query("ZMCPProducePlan.query", _map);
		
		if(result == null || result.isEmpty()) {
			return false;
		}
		else {
			ZMCPProducePlan plan = (ZMCPProducePlan)result.get(0);
			//如果草拟，更新专业计划数据

			if(StringUtils.isNotBlank(plan.getFdPlanStatus()) && plan.getFdPlanStatus().equals("草拟")) {
				Map<String, BigDecimal> _result = ProducePlanCM.CMModify(null, fdKeyId);
				
				BigDecimal bhcmj = _result.get("bhcmj") == null ? new BigDecimal("0") : _result.get("bhcmj");
				BigDecimal zhmcmj = _result.get("zhmcmj") == null ? new BigDecimal("0") : _result.get("zhmcmj");
				BigDecimal hbmjb = new BigDecimal("0");
				if(bhcmj.doubleValue() != 0) {
					hbmjb = BigDecimal.valueOf(zhmcmj.doubleValue() / bhcmj .doubleValue());
				}
				//明细计算量
				plan.setFdPlanBhcmj(bhcmj);	//保护层面积
				plan.setFdPlanHbmjb(hbmjb);	//厚保面积比
				plan.setFdPlanYmhf(_result.get("hf") == null ? new BigDecimal("0") : _result.get("hf"));//原煤灰分
				plan.setFdPlanHcgx(_result.get("gx") == null ? new BigDecimal("0") : _result.get("gx"));//功效
				plan.setFdBasedIn(_result.get("tjd") == null ? new BigDecimal("0") : _result.get("tjd"));//推进度
				
				//专业计划主表数据：掘进煤产量
				if(type == 0) {
					plan.setFdPlanMine(BigDecimal.valueOf(_result.get("bhcsl").doubleValue()+_result.get("zhcsl").doubleValue()+plan.getFdPlanGrubMine().doubleValue()*10000));//原煤产量
					dao.update("ZMCPProducePlan.updateByCM", plan.toMap());//更新生产计划主表数据
				}
				else {
					if (fdProfessionalPlanIds == null)
						fdProfessionalPlanIds = new ArrayList<String>();
					
					Double _sumGrubMine = plan.getFdPlanGrubMine() == null? new Double(0) : plan.getFdPlanGrubMine().doubleValue();
					
					for (int i = 0; i < fdProfessionalPlanIds.size(); i++) {
						String fdProfessionalPlanId = fdProfessionalPlanIds.get(i);
						
						List professionalPlans = ProfessionalPlan.getByKeyId(fdProfessionalPlanId);
						ZMCPProfessionalPlan _professionalPlan = (ZMCPProfessionalPlan)professionalPlans.get(0);
						
						BigDecimal fdPlanGrubMine = _professionalPlan.getFdPlanGrubMine() == null ? new BigDecimal("0") : _professionalPlan.getFdPlanGrubMine();
						
						if(type == 1) {
							_sumGrubMine += fdPlanGrubMine.doubleValue();
						}
						else if(type == 2) {
							_sumGrubMine -= fdPlanGrubMine.doubleValue();
						}						
					}
					
					plan.setFdPlanGrubMine(BigDecimal.valueOf(_sumGrubMine));
					plan.setFdPlanMine(_result.get("ymSum") == null ? plan.getFdPlanGrubMine() : new BigDecimal(_result.get("ymSum").doubleValue()+plan.getFdPlanGrubMine().doubleValue()));//原煤产量
					dao.update("ZMCPProducePlan.updateByCMReport", plan.toMap());//更新生产计划主表数据
				}
			}
			//不是草拟，滚蛋 byebye
		}
		
		return true;
	}
	
	/**
	 * 根据掘进计划明细的变动
	 * 更新专业计划主表的数据
	 * 参数为专业计划keyID
	 * type 0 生产计划从表新增、删除、修改，type 1 专业计划上报，type 2 退回、撤回
	 */
	@SuppressWarnings("rawtypes")
	public static boolean updateByJJ(String fdKeyId, List<String> fdProfessionalPlanIds, int type) {

		if(fdKeyId == null || fdKeyId.trim().equals("")) {
			return false;
		}
		
		Map<String, String> _map = new HashMap<String, String>();
		_map.put("fdKeyId", fdKeyId);
		
		List result = dao.query("ZMCPProducePlan.query", _map);
		
		if(result == null || result.isEmpty()) {
			return false;
		}
		else {
			ZMCPProducePlan plan = (ZMCPProducePlan)result.get(0);
			//如果草拟，更新专业计划数据

			if(StringUtils.isNotBlank(plan.getFdPlanStatus()) && plan.getFdPlanStatus().equals("草拟")) {
				Map<String, BigDecimal> _result = ProducePlanJJ.JJModify(null, fdKeyId);
				
				plan.setFdPlanGrub(_result.get("jcSum") == null ? new BigDecimal("0") : _result.get("jcSum"));//掘进总进尺
				
				//专业计划主表数据
				
				if(type == 0) {
					//修改从表时更新
					dao.update("ZMCPProducePlan.updateByJJ", plan.toMap());//更新生产计划主表数据
				}
				else {
					if (fdProfessionalPlanIds == null)
						fdProfessionalPlanIds = new ArrayList<String>();
					
					Double _scktjc = plan.getFdPlanScktjc() == null ? new Double(0) : plan.getFdPlanScktjc().doubleValue();//生产开拓进尺量
					Double _ysjc = plan.getFdPlanYsjc() == null ? new Double(0) : plan.getFdPlanYsjc().doubleValue();//延伸进尺
					Double _ktdjc = plan.getFdPlanKtdjc() == null ? new Double(0) : plan.getFdPlanKtdjc().doubleValue();//开拓队进尺
					Double _scjc = plan.getFdPlanScjc() == null ? new Double(0) : plan.getFdPlanScjc().doubleValue();//生产进尺
					Double _qyx = plan.getFdPlanQyx() == null ? new Double(0) : plan.getFdPlanQyx().doubleValue();//全岩巷
					
					for (int i = 0; i < fdProfessionalPlanIds.size(); i++) {
						String fdProfessionalPlanId = fdProfessionalPlanIds.get(i);
						
						List professionalPlans = ProfessionalPlan.getByKeyId(fdProfessionalPlanId);
						ZMCPProfessionalPlan _professionalPlan = (ZMCPProfessionalPlan)professionalPlans.get(0);
												
						if(type == 1) {
							_scktjc += _professionalPlan.getFdJcKt() == null ? new Double(0) : _professionalPlan.getFdJcKt().doubleValue();
							_ysjc += _professionalPlan.getFdJcYs() == null ? new Double(0) : _professionalPlan.getFdJcYs().doubleValue();
							_ktdjc += _professionalPlan.getFdJcKtd() == null ? new Double(0) : _professionalPlan.getFdJcKtd().doubleValue();
							_scjc += _professionalPlan.getFdJcSc() == null ? new Double(0) : _professionalPlan.getFdJcSc().doubleValue();
							_qyx += _professionalPlan.getFdJcQy() == null ? new Double(0) : _professionalPlan.getFdJcQy().doubleValue();
						}
						else if(type == 2) {
							_scktjc -= _professionalPlan.getFdJcKt() == null ? new Double(0) : _professionalPlan.getFdJcKt().doubleValue();
							_ysjc -= _professionalPlan.getFdJcYs() == null ? new Double(0) : _professionalPlan.getFdJcYs().doubleValue();
							_ktdjc -= _professionalPlan.getFdJcKtd() == null ? new Double(0) : _professionalPlan.getFdJcKtd().doubleValue();
							_scjc -= _professionalPlan.getFdJcSc() == null ? new Double(0) : _professionalPlan.getFdJcSc().doubleValue();
							_qyx -= _professionalPlan.getFdJcQy() == null ? new Double(0) : _professionalPlan.getFdJcQy().doubleValue();
						}
					}
					
					//生产开拓进尺量
					plan.setFdPlanScktjc(BigDecimal.valueOf(_scktjc));
					//延伸进尺
					plan.setFdPlanYsjc(BigDecimal.valueOf(_ysjc));
					//开拓队进尺
					plan.setFdPlanKtdjc(BigDecimal.valueOf(_ktdjc));
					//生产进尺
					plan.setFdPlanScjc(BigDecimal.valueOf(_scjc));
					//全岩巷
					plan.setFdPlanQyx(BigDecimal.valueOf(_qyx));

					dao.update("ZMCPProducePlan.updateByJJReport", plan.toMap());//更新生产计划主表数据
					
				}
			}
			//不是草拟，滚蛋 byebye
		}
		
		return true;
	}
	
	/**
	 * 判断生产计划是否生效
	 * @param fdKeyId
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static boolean validate(String fdKeyId) {
		if(fdKeyId == null)
			return true;
		
		Map<String, String> _map = new HashMap<String, String>();
		_map.put("fdKeyId", fdKeyId);
		_map.put("fdFdPlanStatus", "草拟");
		List result = dao.query("ZMCPProducePlan.query", _map);
		
		if(result == null || result.isEmpty()) {
			//主表都不存在，则不能新增从表
			return false;
		}
		else {
			return true;
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static boolean validate(Map<String, String> _map) {
		if(_map == null)
			return false;
		
		List result = dao.query("ZMCPProducePlan.query", _map);
		
		if(result == null || result.isEmpty()) {
			//主表都不存在，则不能新增从表
			return false;
		}
		else {
			return true;
		}
	}
	
	@SuppressWarnings("rawtypes")
	public static List goback(Map<String, String> _map) {
		if(_map == null)
			return null;
		
		return dao.query("ZMCPProducePlan.query", _map);
	}
	
	@SuppressWarnings("rawtypes")
	public static List getProducePlanDetails(String sql, String fdMiningId) {
		Map<String, String> _map = new HashMap<String, String>();
		_map.put("fdMiningId", fdMiningId);
		List result = dao.query(sql, _map);
		return result;
	}
}
